import java.util.Vector;

import javax.swing.JOptionPane;


/**
 * Klasse die checked voor alle processen of we wel op tijd keep alive berichten ontvangen.
 * 
 * @author Jelle Polders
 *
 */
public class KeepAliveChecker extends Thread {
	Vector<Long> times;
	SpelManager spelmanager;
	
	/**
	 * Constructor
	 * 
	 * @param spelManager de spelmanager
	 */
	public KeepAliveChecker(SpelManager spelmanager) {
		times = new Vector<Long>();
		this.spelmanager = spelmanager;
	}
	
	/**
	 * Voegt een nieuw process toe
	 * 
	 * @param processID het ID van het process dat toegevoegd moet worden
	 */
	public synchronized void add(int processID) {
		for (int i = times.size(); i <= processID; i++)
			times.add(new Long(-1));
		
		times.add(processID, System.currentTimeMillis());
		times.remove(processID + 1);
	}
	
	/**
	 * Zorgt ervoor dat we niet meer gaan letten op het meegegeven process bij het checken van de keep alive messages.
	 * 
	 * @param processID het process ID van het process waarop we niet meer moeten checken
	 */
	public void remove(int processID) {
		setDefaultTime(processID);
	}
	
	/**
	 * De run-methode die uitgevoerd wordt door de thread.
	 */
	public void run() {
		while (true) {
			for (int i = 0; i < times.size(); i++)
				if ( i != spelmanager.eigenID && times.get(i) > -1 && (times.get(i) - System.currentTimeMillis()) > 10000) {
					JOptionPane.showMessageDialog(null, "Hier");
					spelmanager.verwijderSpeler(i);
					spelmanager.sendFailure(i);
					setDefaultTime(i);
					if (i == spelmanager.managerID)
						spelmanager.startElection();
				}
			
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * Zet de huidige tijd voor een bepaald process.
	 * 
	 * @param processID het ID van het process waarvoor de tijd gezet moet worden.
	 */
	public synchronized void setTime(int processID) {
		if (times.contains(processID)) {
			times.add(processID, System.currentTimeMillis());
			times.remove(processID + 1);
		}
	}
	
	/**
	 * Zet de default tijd voor een bepaald process. Hierdoor zal er niet meer op dit process gechecked worden.
	 * 
	 * @param processID het process ID waarvoor we de default tijd willen zetten
	 */
	private synchronized void setDefaultTime(int processID) {
		times.add(processID, new Long(-1));
		times.remove(processID + 1);
	}

	public Vector<Long> getTimes() {
		return times;
	}

	public void setTimes(Vector<Long> times) {
		this.times = times;
	}
}
